Technical Q&A QA1135
Using QuickTime to access MP3 ID3 Tags


Q: QuickTime Ç™ MP3 å`éÆÇÃâπäyÉtÉ@ÉCÉãÇà ID3 É^ÉOÇ÷ÇÃÉAÉNÉZÉXÇâ¬î\Ç…Ç∑ÇÈÇÃÇÕímǡǃǢNjÇ∑Ç™ÅAǪÇÃã@î\ÇÃóòópï˚ñ@Ç™ÇÌÇ©ÇËÇ‹ÇπÇÒÅBéÑÇÕÅAã»ÇÃÉ^ÉCÉgÉãÅAÉAÉãÉoÉÄÇÃÉ^ÉCÉgÉãÅAÉAÅ[ÉeÉBÉXÉgñºÅAî≠ï\îNÅAÇ®ÇÊÇ—ÉgÉâÉbÉNî‘çÜÇÃèÓïÒǙǫǧǵǃLJïKóvÇ»ÇÃÇ≈Ç∑ÅB

A: QuickTime/MP3 Çà Movie Importer ÇÕ ID3 É^ÉOÇîFéØÇµÅAǪÇÍÇÁÇÉÄÅ[ÉrÅ[ÇÃÉÜÅ[ÉUÉfÅ[É^ÇΔǵǃï€ë∂Ç≥ÇÍÇÈÉÄÅ[ÉrÅ[ÇÃíçéflÇ…ïœä∑ǵNjÇ∑ÅB.mp3 ÉtÉ@ÉCÉãÇÉÄÅ[ÉrÅ[ÇΔǵǃÉCÉìÉ|Å[ÉgǵÅAǪÇÃå„ GetMovieUserDataÅAGetNextUserDataTypeÅAÇ®ÇÊÇ— GetUserDataText ÇÃÇÊǧǻ Movie Toolbox API ÇåƒÇ—èoÇ∑DZÇΔÇ…ÇÊǡǃÅADZÇÃÉÜÅ[ÉUÉfÅ[É^Ç…ÉAÉNÉZÉXÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

ÉäÉXÉg 1 Ç…é¶Ç∑ÉRÅ[ÉhÇÕÅAÉÜÅ[ÉUÉfÅ[É^ÇÃÉäÉXÉgÇéÛÇØéÊÇËÅAÉÜÅ[ÉUÉfÅ[É^ÇÃçÄñ⁄ÇÉRÉìÉ\Å[ÉãÇ…èoóÕǵNjÇ∑ÅBÉÜÅ[ÉUÉfÅ[É^ÇÃäeÉ^ÉCÉvÇÕàÍà”ÇÃéØï éqÇéùǡǃǢNjÇ∑ÅBÇΩÇΔǶnjéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

kUserDataTextFullName = FOUR_CHAR_CODE('©nam')
kUserDataTextArtist = FOUR_CHAR_CODE('©ART')
kUserDataTextAlbum = FOUR_CHAR_CODE('©alb')

ãªñ°ê[Ç¢ÉÜÅ[ÉUÉfÅ[É^É^ÉCÉvÇÃÉäÉXÉgÇå©ÇÈÇ…ÇÕ Movies.h ÇéQèΔǵNjÇ∑ÅB

Movie ÇÃÉgÉâÉbÉNÇΔÉÅÉfÉBÉALJìΔé©ÇÃÉÜÅ[ÉUÉfÅ[É^ÉäÉXÉgÇéùǡǃǢNjÇ∑ÅBDZÇÍÇÁÇÃÉäÉXÉgÇÕǪÇÍǺÇÍÅAGetTrackUserData Ç‹ÇΩÇÕ GetMediaUserData ÇåƒÇ—èoÇ∑DZÇΔÇ…ÇÊǡǃÉAÉNÉZÉXÇ≈Ç´Ç‹Ç∑ÅB

const UInt8 kUserDataIsText = 0xA9; // íòçÏå†ãLçÜ

OSErr PrintUserData(UserData inUserData)
{
  OSType udType;
  short count, i;
  char nul = 0;
  Handle hData = NULL;
  Ptr p;

  OSErr err = noErr;

  hData = NewHandle(0);
  udType = GetNextUserDataType(inUserData, 0);
  if(0 != udType) {
    printf("\nMeta-data:\n");

    do {
      count = CountUserDataType(inUserData, udType);
      for(i = 1; i <= count; i++) {
        if((udType>>24) == kUserDataIsText) {

          // udType ÇÃç≈èâÇÃï∂éöÇ™ 0xA9ÅiíòçÏå†ãLçÜÅjÇÃèÍçáÅA
          // GetUserData ÇÃë„ÇÌÇËÇ… GetUserDataText ÇégópÇ∑ÇÈÅB
          // ãªñ°ê[Ç¢ÉÜÅ[ÉUÉfÅ[É^É^ÉCÉvÇÃÉäÉXÉgÇå©ÇÈÇ…ÇÕ Movies.h ÇéQèΔÇ∑ÇÈ
          err = GetUserDataText(inUserData, hData, udType, i, langEnglish);
          if (err) goto bail;

          // ÉnÉìÉhÉãÇ™éwÇ∑ï∂éöóÒÇÉkÉãÇ≈èIóπÇ∑ÇÈ
          PtrAndHand(&nul, hData, 1);

          // ÉLÉÉÉäÉbÉWÉäÉ^Å[ÉìÇÕÇ∑Ç◊ǃÉXÉyÅ[ÉXÇ…ïœä∑
          p = *hData;
          while(*p) {
            if (*p == kReturnCharCode) *p = ' ';
            p++;
          };

          HLock(hData);
          printf("  %c%c%c%c: %s\n", (char)(udType>>24),
                (char)(udType>>16),
                (char)(udType>>8),
                (char)udType, *hData);
          HUnlock(hData);

        } else {

          err = GetUserData(inUserData, hData, udType, i);
          if (err) goto bail;

          printf("  %c%c%c%c: [%d bytes]\n",
                (char)(udType>>24),
                (char)(udType>>16),
                (char)(udType>>8),
                (char)udType, GetHandleSize(hData));
        }
      }

      udType = GetNextUserDataType(inUserData, udType);

    } while(0 != udType);
  }

bail:
  printf("\n");

  // íçà”ÅFäÑÇËìñǃǃǢǻǢ UserData ÇÕîjä¸ÇµÇ»Ç¢
  DisposeHandle(hData);

  return err;
}

ÉäÉXÉg 1Å@PrintUserData


{
  UserData userData = 0;
  OSErr err;

  ...

  userData = GetMovieUserData(theMovie);
  if (userData) {
    err = PrintUserData(userData);
  }

  ...
}                  

ÉäÉXÉg 2Å@ÉäÉXÉg 1 ÇåƒÇ—èoÇ∑ÉRÅ[ÉhÇÃî≤êà

.mp3 ÉtÉ@ÉCÉãÇégǡǃÉäÉXÉg 1 Ç…ÇÊÇËê∂ê¨Ç≥ÇÍÇΩèoóÕÇÃó·

Meta-data:

    ©nam: allthewayhome.mp3

    ©ART: Spinal Tap

    ©alb: Break Like The Wind

    ©day: 1992

    ©trk: 14/14

    ©cmt: It goes to 11


éQçlï∂å£ÅF

Working with Movie UserData

Track Names - Ice Floe #2


[2002 îN 4 åé 8 ì˙]